#include <iostream>
#include <memory>  //智能指针对应的头文件
using namespace std;

/*
	auto_ptr的使用
	1.源码展示
	   template<typename T>
	   class auto_ptr
	   {
	    public:
			auto_ptr(T *n)  //T *n=new int
			{
				p=n;
			}
			~auto_ptr()
			{
				delete p;
			}
		private:
			T *p;
	   };
	 2.auto_ptr只能申请1个类型大小的堆空间，无法申请多个 
	   原因：auto_ptr设计的时候，没有重载加法，没有重载[]，因此无法访问多个类型大小的堆空间
	         *(p1+1)=78;  //没有重载加法，不能这么写
			 p1[1]=78;    //没有重载[]，不能这么写
*/

int main()
{
	//创建auto_ptr类的对象
	//申请了一个int大小的堆空间
	//p1创建的时候--》堆空间就自动申请
	//p1释放的时候--》堆空间就一起释放
	auto_ptr<int> p1(new int);
	
	//auto_ptr<struct student> p2(new struct student);
	//auto_ptr<Cat> p3(new Cat);
	
	//往堆空间存放数据
	//正确的：auto_ptr重载了解引用
	//人类习惯
	*p1=78;
	//函数调用
	//p1.operator*()=78;
	
	//错误的：auto_ptr类根本就没有重载[]，所有不能这么写
	//p1[0]=78;
	
	cout<<"你存放的数据是: "<<*p1<<endl;
	
	return 0;
}